home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Memphis Amiga Group
/
MAG Virus Utilities (1991-10)(Memphis Amiga Group).zip
/
MAG Virus Utilities (1991-10)(Memphis Amiga Group).adf
/
Berserker5.01
/
Berserker.s
< prev
next >
Wrap
Text File
|
1991-09-06
|
45KB
|
1,971 lines
;==============================================================================
;
; B E R S E R K E R 5.02
; +++++++++++++++++++++++
;
; © Copyright 1988, 1989, 1990 by Ralf Thanner
;
; The code is entirely written in assembler for the Kuma Seka assembler
;
;=============================== BERSERKER ==================================
;
; IMPORTANT NOTICE: This program is (c) Copyright by Ralf Thanner, but can
; be FREELY DISTRIBUTED, providing that the following rules are respected.
;
; - No change is made to the program nor to the accompaning documentation.
;
; - Every form of distribution is allowed and encouraged, but no fee can
; be charged for this program except for, possibly, the cost of magnetic
; media.
;
; - The package is always distributed in its complete form consisting of 4
; files: 'BERSERKER', 'BERSERKER-HANDLER', 'BERSERKER.Doc' and
; 'BERSERKER.S'.
;
; By copying, distributing and/or using the program you indicate your
; acceptance of the above rules.
;
;==============================================================================
;
;
; V5.02 - again fine tuning.
; CLI PARAMETER CHECK recognizes now TAB's.
;
; - new handler version -> V1.5
;
;=============================================================================
forbid EQU -132 ; Exec.library
permit EQU -138
allocmem EQU -198
freemem EQU -210
availmem EQU -216
findname EQU -276
addtask EQU -282
findtask EQU -294
settaskpri EQU -300
getmsg EQU -372
replymsg EQU -378
waitport EQU -384
findport EQU -390
closelib EQU -414
openresource EQU -498
openlib EQU -552
open EQU -30 ; Dos.library
close EQU -36
read EQU -42
write EQU -48
output EQU -60
seek EQU -66
delete EQU -72
loadseg EQU -150
unloadseg EQU -156
delay EQU -198
mode_old EQU 1005
mode_new EQU 1006
clearmenustrip EQU -54 ; Intuition.library
closwindow EQU -72
dispalert EQU -90
drawborder EQU -108
openwindow EQU -204
printitext EQU -216
setwindowtitles EQU -276
;=============================================================================
NULL EQU $00000000 ; FLAGS USED BY POWERWINDOW
MENUNULL EQU $00000000
WBENCHSCREEN EQU $00000001
CUSTOMSCREEN EQU $0000000f
MENUENABLED EQU $00000001
MIDRAWN EQU $00000100
SIZEVERIFY EQU $00000001 ; IDCMP - FLAGS
NEWSIZE EQU $00000002
REFRESHWINDOW EQU $00000004
MOUSEBUTTONS EQU $00000008
MOUSEMOVE EQU $00000010
GADGETDOWN EQU $00000020
GADGETUP EQU $00000040
REQSET EQU $00000080
MENUPICK EQU $00000100
CLOSEWINDOW EQU $00000200
RAWKEY EQU $00000400
REQVERIFY EQU $00000800
REQCLEAR EQU $00001000
MENUVERIFY EQU $00002000
NEWPREFS EQU $00004000
DISKINSERTED EQU $00008000
DISKREMOVED EQU $00010000
WBENCHMESSAGE EQU $00020000
ACTIVEWINDOW EQU $00040000
INACTIVEWINDOW EQU $00080000
DELTAMOVE EQU $00100000
VANILLAKEY EQU $00200000
INTUITICKS EQU $00400000
LONELYMESSAGE EQU $80000000
WINDOWSIZING EQU $00000001 ; WINDOW TYPE
WINDOWDRAG EQU $00000002
WINDOWDEPTH EQU $00000004
WINDOWCLOSE EQU $00000008
SIZEBRIGHT EQU $00000010
SIZEBOTTOM EQU $00000020
SMART_REFRESH EQU $00000000
SIMPLE_REFRESH EQU $00000040
SUPER_BITMAP EQU $00000080
BACKDROP EQU $00000100
REPORTMOUSE EQU $00000200
GIMMEZEROZERO EQU $00000400
BORDERLESS EQU $00000800
ACTIVATE EQU $00001000
WINDOWACTIVE EQU $00002000
INREQUEST EQU $00004000
MENUSTATE EQU $00008000
RMBTRAP EQU $00010000
NOCAREREFRESH EQU $00020000
WINDOWREFRESH EQU $01000000
WINDOWTICKED EQU $04000000
WBENCHWINDOW EQU $02000000
RP_JAM1 EQU $00000000 ; TEXTMODI
RP_JAM2 EQU $00000001
RP_COMPLEMENT EQU $00000002
RP_INVERSIZED EQU $00000004
HIGHIMAGE EQU $00000000 ; MENU ITEM
CHECKIT EQU $00000001
ITEMTEXT EQU $00000002
COMMSEQ EQU $00000004
MENUTOGGLE EQU $00000008
ITEMENABLED EQU $00000010
HIGHCOMP EQU $00000040
HIGHBOX EQU $00000080
HIGHNONE EQU $000000C0
CHECKED EQU $00000100
BOOLGADGET EQU $00000001 ; GADGET TYPE
GADGET0002 EQU $00000002
PROPGADGET EQU $00000003
STRGADGET EQU $00000004
SIZING EQU $00000010 ; SYSTEM GADGETS
WDRAGGING EQU $00000020
SDRAGGING EQU $00000030
WUPFRONT EQU $00000040
SUPFRONT EQU $00000050
WDOWNBACK EQU $00000060
SDOWNBACK EQU $00000070
gCLOSE EQU $00000080
REQGADGET EQU $00001000 ; TYPES
GZZGADGET EQU $00002000
SCRGADGET EQU $00004000
SYSGADGET EQU $00008000
GADGHCOMP EQU $00000000 ; HIGHLIGHT TECHNIQUE
GADGHBOX EQU $00000001
GADGHIMAGE EQU $00000002
GADHHNONE EQU $00000003
GADGHIGHBITS EQU $00000003
GADIMAGE EQU $00000004
GRELBOTTOM EQU $00000008 ; LEFT & TOP COORDINATES
GRELRIGHT EQU $00000010
GRELWIDHT EQU $00000020
RELVERIFY EQU $00000001 ; GADGET ACTIVATION FLAGS
GADGIMMEDIATE EQU $00000002
ENDGADGET EQU $00000004
FOLLOWMOUSE EQU $00000008
RIGHTBORDER EQU $00000010
LEFTBORDER EQU $00000020
TOPBORDER EQU $00000040
BOTTOMBORDER EQU $00000080
TOGGLESELECT EQU $00000100
STRINGCENTER EQU $00000200
STRINGRIGHT EQU $00000400
LONGINT EQU $00000800
ALTKEYMAP EQU $00001000
;=============================================================================
POWERUP
movem.l d0-d7/a0-a6,-(a7)
LEA VAR(PC),A5
move.l $04.w,a6
suba.l a1,a1
jsr findtask(a6)
move.l d0,a4
move.l d0,mytask-VAR(A5)
tst.l $ac(a4)
bne.s cli_call
lea $5c(a4),a0
jsr waitport(a6)
lea $5c(a4),a0
jsr getmsg(a6)
move.l d0,message-var(a5)
not.b launch-var(a5)
movem.l (a7)+,d0-d7/a0-a6
LEA VAR(PC),A5
bra.L workbench
* CLI-PARAMETER HANDLER
cli_call
movem.l (a7)+,d0-d7/a0-a6
LEA VAR(PC),A5
subq #1,d0
beq.s no_cli_parameter
which_parameter
cmp.b #$20,(a0)+
bne.s parameter_found
dbra d0,which_parameter
bra.s no_cli_parameter
parameter_found
move.b -(a0),d1
cmp.b #$09,d1
beq.s TAB
cmp.b #'?',d1
beq.L instructions
cmp.b #'C',d1
beq.s no_cold
cmp.b #'c',d1
beq.s no_cold
cmp.b #'I',d1
beq.s install_it
cmp.b #'i',d1
beq.s install_it
cmp.b #'R',d1
beq.s remove_it
cmp.b #'r',d1
beq.s remove_it
bne.s no_cli_parameter
TAB
addq.l #1,a0
bra.s which_parameter
no_cold
addq.l #1,a0
not.b no_killy-VAR(a5)
bra.s which_parameter
install_it
addq.l #1,a0
not.b launcher-VAR(a5)
bra.s which_parameter
remove_it
addq.l #1,a0
not.b remover-VAR(a5)
bra.s which_parameter
no_cli_parameter
move.l $04.w,a6
jsr FORBID(a6) ; forbid all tasks
bsr.L open_libs
bsr.L test_lib
bsr.L open_output
tst.w kickflag-VAR(a5)
bne.s wrong_kick
bsr.L kill_viruses
tst.b virusflag-VAR(a5)
bne.s exit4 ; Lucky ones...
move.l #mes0,d2
move.l #mes0length,d3
bsr.L writer
bra.s exit3
exit4: bsr.L alert ; Virus found
exit3: tst.b launcher-VAR(a5)
beq.s exit6
bsr.L loader
bra.s exit7
exit6: tst.b remover-VAR(a5)
beq.s exit7
bsr.L un_load
exit7: move.l $04.w,a6
jsr PERMIT(a6) ; Allow other tasks
exit5: bsr.L close_libs
moveq #00,d0
rts
wrong_kick
move.l #mes17,d2
move.l #mes17length,d3
bsr.L writer
bra.s exit3
exit_workbench
bsr.L close_libs
move.l $04.w,a6
jsr forbid(a6)
move.l message(pc),a1
jsr replymsg(a6)
moveq #00,d0 ; For clear entry into CLI
rts ; Back to CLI...
************************* SUB ROUTINES *********************************
WORKBENCH
bsr.L open_libs
bsr.L test_lib
bsr.L INIT
WORK: bsr.L wait_port_get_msg_reply_msg_auswertung_msg
tst.b leave_it-VAR(a5) ; window close
bne.s work_leave1
move.l dosbase(pc),a6
move.l #$0a,d1
jsr delay(a6)
bra.s work
work_leave1
move.l intbase(pc),a6
move.l windowhandle(pc),a0
jsr closwindow(a6)
bra.l exit_workbench
wait_port_get_msg_reply_msg_auswertung_msg
move.l $04.w,a6
move.l userport(pc),a0
jsr waitport(a6)
move.l userport(pc),a0
jsr getmsg(a6)
move.l d0,a0
add.l #$14,a0
lea message_list(pc),a1
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l d0,a1
jsr replymsg(a6)
lea message_list(pc),a0
move.l (a0)+,d0
cmp.w #$200,d0 ; closewindow
beq.s message_auswertung2
cmp.w #$40,d0 ; gadup
beq.s message_auswertung1
rts
message_auswertung2
not.b leave_it-VAR(A5)
rts
message_auswertung1
addq #4,a0
move.l (a0),a1
gad_auswertung
lea gad_table(pc),a0
moveq #0,d0
gad_auswertung0
cmp.l (a0)+,a1
beq.s main_auswertung
addq #1,d0
bra.s gad_auswertung0
main_auswertung
tst.w d0
beq.s kill_em
cmp.w #1,d0
beq.L loader
cmp.w #2,d0
beq.L un_load
cmp.w #3,d0
beq.L workbench_instructions
not.b leave_it-VAR(A5)
rts
kill_em
move.l $04.w,a6
jsr forbid(a6)
tst.w kickflag-VAR(a5)
bne.s kill_em2
bsr.L kill_viruses
tst.b virusflag-VAR(a5)
beq.s kill_em1
bsr.L alert
clr.b virusflag-VAR(a5)
bra.s kill_em2
kill_em1
lea Itext11(pc),a0
bsr.L write_text
kill_em2
move.l $04.w,a6
jsr permit(a6) ; Allow it all
rts
* from WORKBENCH it's 'left mouse' & from CLI it's 'RETURN'
workbench_instructions
bsr.L open_con
bsr.L instructions0
move.l #mes215,d2 ; press mouse
move.l #mes215length,d3
bsr.L writer
bsr.L right_mouse_button ; mit delay
bsr.L close_con
rts
instructions
bsr.L test_pal
bsr.L open_libs
bsr.L open_output
tst.w pal-VAR(a5)
bne.s instructions2
move.l #mes15,d2 ; Prints out the instructions
move.l #mes15length,d3
bsr.L writer
bra.L exit5
instructions2
bsr.s instructions0
bra.L exit5
instructions0
move.l #mes15,d2 ; first part
move.l #mes115length,d3
bsr.L writer
tst.b launch
bne.s instructions01 ; workbench-> mouse
move.l #mes415,d2 ; press return
move.l #mes415length,d3
bsr.L writer
bsr.L read_con
bra.s instructions02
instructions01
move.l #mes215,d2 ; press mouse
move.l #mes215length,d3
bsr.L writer
bsr.L right_mouse_button
instructions02
move.l #con_error,d2 ; clear it
move.l #con_clear-con_error,d3
bsr.L writer
move.l #mes115end,d2 ; second part
move.l #mes315length,d3
bra.L writer
un_load
move.l $04.w,a6
lea task_name(pc),a1
jsr findtask(a6)
tst.l d0
beq.s nix_un_load
move.l d0,a0
jsr $5c(a0) ; EXIT-TC
move.l dosbase(pc),a6
jsr unloadseg(a6)
tst.l message-VAR(a5) ; workbench start
bne.s un_load1 ; nix dos-write
move.l #mes21,d2
move.l #mes21length,d3
bra.L short_writer
un_load1
lea mes21(pc),a0
bra.L write_text
nix_un_load
tst.l message-VAR(a5)
bne.s nix_un_load1
move.l #mes20,d2
move.l #mes20length,d3
bra.L short_writer
nix_un_load1
lea mes20(pc),a0
bra.L write_text
loader
move.l $04.w,a6
lea task_name(pc),a1
jsr findtask(a6)
tst.l d0
bne.s nix_load
move.l dosbase(pc),a6
lea name(pc),a0
move.l a0,d1
jsr loadseg(a6)
tst.l d0
beq.L loader_error
move.l d0,d1
add.l d0,d0
add.l d0,d0
addq.l #4,d0
move.l d0,a4
move.l $04.w,A6
move.l dosbase(pc),a0
move.l d1,a1
move.l intbase(pc),a2
move.l trackdisk(pc),a3
jsr $5a(a4)
tst.b launch-VAR(a5)
bne.s loader1
move.l #mes22,d2
move.l #mes22length,d3
bra.L short_writer
loader1
lea mes22(pc),a0
bra.L write_text
nix_load
tst.b launch-VAR(a5)
bne.s nix_load1
move.l #mes23,d2
move.l #mes23length,d3
bra.L short_writer
nix_load1
lea mes23(pc),a0
bra.L write_text
loader_error
tst.b launch-VAR(a5)
bne.s loader_error1
move.l #mes19,d2
move.l #mes19length,d3
bra.L writer
loader_error1
lea mes25(pc),a0
bra.s write_text
*****************************************************************************
INIT
moveq #-3,d0
set_task_pri
move.l mytask(pc),a1
move.b d0,newtaskpri-VAR(A5)
jsr settaskpri(a6)
open_window
move.l intbase(pc),a6
lea NewWindowStructure1(pc),a0
jsr openwindow(a6)
move.l d0,windowhandle-VAR(A5)
move.l d0,a0
get_my_port
move.l 86(a0),userport-VAR(A5)
move.l 50(a0),my_rastport-VAR(A5)
draw_border
lea border(pc),a1
move.l my_rastport(pc),a0
move.w #2,d0
move.w #110,d1
jmp drawborder(a6)
test_lib
move.l dosbase(pc),a0
move.w $14(a0),d1
cmp.w #35,d1 ; darf nicht OS 2.0 sein
ble.s yo_lib
not.w kickflag-VAR(a5)
yo_lib: rts
write_text
lea IntText(pc),a1
move.l a0,12(a1)
move.l intbase(pc),a6
move.l my_rastport(pc),a0
moveq #0,d0
moveq #0,d1
jmp printitext(a6)
open_output
move.l Dosbase(pc),a6
jsr output(a6)
move.l d0,handle-VAR(a5)
rts
open_con
move.l Dosbase(pc),a6
move.l #con,d1
move.l #mode_old,d2
jsr open(a6)
LEA VAR(pc),A5
move.l d0,handle-VAR(a5)
rts
close_con
move.l Dosbase(pc),a6
move.l handle-VAR(a5),d1
jmp close(a6)
test_pal
move.l $04.w,a6
cmp.b #$32,530(a6)
beq.s test_pal1
not.w pal-VAR(a5)
test_pal1
rts
writer: move.l Dosbase(pc),a6
move.l handle(pc),d1
jmp write(a6)
short_writer ; to avoid two messages in memory..
move.l Dosbase(pc),a6
move.l handle(pc),d1
jsr write(a6)
move.l handle(pc),d1
move.l #mes24,d2
move.l #mes24length,d3
jmp write(a6)
writer1:move.l Dosbase(pc),a6
move.l handle(pc),d1
jsr write(a6)
move.l handle(pc),d1
move.l #mes,d2
move.l #meslength,d3
jmp write(a6)
alert: lea alert1(pc),a0
calert: move.l Intbase(pc),a6
moveq #00,d0 ; Recovery Alert
move.l #28,d1
jmp dispalert(a6)
killcold_cool
tst.b no_killy-VAR(a5)
bne.s kcc3
move.l $04.w,a6
clr.l 46(a6) ; cool-capture normal
clr.l 42(a6) ; cold-capture normal
clr.l 50(a6)
lea 34(a6),a0 ; New execbase checksum
moveq #0,d0
moveq #$17,d1
kcc1: add.w (a0)+,d0
dbf d1,kcc1
not.w d0
move.w d0,(a0)
kcc3: rts
tracker
move.l $04.w,a6
lea 350(a6),a0
lea Trddevice(pc),a1 ; Searches
jsr findname(a6) ; for trackdisk.device
move.l d0,a0
sub.l #28,a0 ; that's the most used
move.l a0,trackdisk-VAR(a5)
rts ; pointer in trd.dev...
filler: lea $400(a0),a1
fill1: clr.l (a0)+
cmpa.l a0,a1
bge.s fill1
rts
clear_kicktag
move.l $04.w,a6
clr.l 554(a6) ; Kickchecksum
clr.l 550(a6) ; Kicktagptr
clr.l 546(a6) ; Kickmemptr
rts
open_libs
move.l $04.w,a6
lea.l Dosname(pc),a1
bsr.s open_libs1
move.l d0,dosbase-VAR(a5)
lea.l expname(pc),a1 ; expansion
bsr.s open_libs1
move.l d0,expbase-VAR(a5)
lea.l Intname(pc),a1
bsr.s open_libs1
move.l d0,IntBase-VAR(a5)
lea.l layname(pc),a1
bsr.s open_libs1
move.l d0,laybase-VAR(a5)
lea.l gfxname(pc),a1
bsr.s open_libs1
move.l d0,gfxBase-VAR(a5)
rts
open_libs1
moveq #$21,d0
jmp openlib(a6)
close_libs
move.l $04.w,a6
move.l dosbase(pc),a1
bsr close_libs2
move.l IntBase(pc),a1
bsr close_libs2
move.l gfxbase(pc),a1
bsr close_libs2
move.l laybase(pc),a1
bsr close_libs2
move.l expBase(pc),a1
bsr close_libs2
rts
close_libs2
jmp closelib(a6)
right_mouse_button
move.l dosbase(pc),a6
right_mouse_button1
move.l #$0a,d1
jsr delay(a6)
btst #10,$dff016
bne.s right_mouse_button1
rts
read_con
clr.w input_buffer-VAR(A5)
move.l dosbase(pc),a6
move.l handle(pc),d1
move.l #input_buffer,d2
move.l #2,d3 ; nur ein zeichen
jsr read(a6)
move.b input_buffer-VAR(a5),d0
cmp.b #$0a,d0 ; wenn ich RETURN
bne.s read_con ; schreibe, meine
rts ; ich es auch so..
******************** L I B C H E C K E R *****************************
lib_checker
lea layname(pc),a2
move.l laybase-VAR(a5),a0
bsr.s lib_check
lea expname(pc),a2
move.l expbase-VAR(a5),a0
bsr.s lib_check
lea gfxname(pc),a2
move.l gfxbase-VAR(a5),a0
bsr.s lib_check
lea intname(pc),a2
move.l intbase-VAR(a5),a0
bsr.s lib_check
lea exename(pc),a2
move.l $04.w,a0 ; execbase
bra.s lib_check
lib_check
cmp.l #0,a0
beq.s lib_check_ende
moveq #0,d0
moveq #0,d1
moveq #0,d2
move.l a0,a1
move.w $10(a1),d0 ; laenge vor knoten
move.w $1c(a1),d2 ; checksum
lsr.w #1,d0 ; for dbf
bra.s lib_check2
lib_check1
add.w -(a0),d1
lib_check2
dbf d0,lib_check1
cmp.w d1,d2
beq.s lib_check_ende
bsr.s lib_checker_alert
lib_check_ende
rts
lib_checker_alert
lea alert4(pc),a0
lib_checker_alert1
move.b (a2)+,(a0)+
bne.s lib_checker_alert1
move.b #$20,-(a0)
lea alert3(pc),a0
bra.L calert
**************************************************************************
kill_viruses
lea VAR(pc),a5
bsr.L jack ; The Traveling JACK
bsr.L centurion
bsr.l disaster_master
bsr.L Xeno ; XENO - Link
bsr.L revenge ; REVENGE (old one)
bsr.L revenge_boot ; REVENGE - BOOTLOADER
bsr.L gadaffi ; Gadaffi
bsr.L disk_doctor ; Disk Doctor
bsr.L sca ; Checks for SCA & mutants
bsr.L dasa ; Checks for Byte Warrior
bsr.L irq ; Link
bsr.L bsg ; Link
bsr.L exterminator
bsr.L bytebandit
bsr.L killcold_cool
bsr.L lib_checker
rts
******************* V I R U S K I L L I N G P A R T ********************
jack: ; improved to find also the mutant version
move.l dosbase(pc),a0
move.l 46(a0),a1 ; pointer to jack
move.l (a1)+,d0
cmp.l #$48e7fffe,d0
bne.s no_jack
addq.l #4,a1
move.l (a1),d0
cmp.l #$0c000001,d0
bne.s no_jack ; no jack anymore he he
move.l #$4e714e71,(a1)+
move.w #$4e71,(a1)
move.b #1,virusflag-VAR(A5)
tst.b launch-VAR(a5)
bne.s jack1
move.l #mes18,d2
move.l #mes18length,d3
bra.L writer1
no_jack:rts
jack1
lea vir0(pc),a0
bra.L write_text
***************************************************************************
* The Traveling JACK
*
* you can wipe him out with a reset..
* he changes the dos.lib jump tab..
* (meine hochachtung fuer die routinen, hat richtig spass gemacht)
* he tries to infect a file..
* when he is installed, he tries to write his 'VIRUS.xx' file to
* the disk. each time a programm access the drive he write his
* stupid text.
***************************************************************************
centurion:
move.l $04.w,a6
move.l 550(a6),d0
beq.s cen_exit
move.l d0,a0
move.l 30(a0),a1
lea cen(pc),a0
moveq #3,d0
cen1: cmpm.l (a0)+,(a1)+ ; the first four longs
dbne d0,cen1 ; of his code..
tst.w d0
bpl.s cen_exit
move.l -610(a6),a0
cmp.l #$7f0fe,a0
bne.s cen_exit
lea $7fdf0,a0 ; is his save back
move.l (a0),-610(a6) ; pointer..
bsr.L tracker
lea $7fdf4,a1 ; restore
move.l (a1),(a0) ; trackdisk.device
bsr.L clear_kicktag ; throw resident out
lea $7f000,a0
bsr.L filler ; clears memory
bsr.L filler ; clears memory part2
bsr.L filler ; clears memory part3
move.b #1,virusflag-VAR(A5)
tst.b launch-VAR(a5)
bne.s cen11
move.l #mes16,d2
move.l #mes16length,d3
bra.L writer1
cen_exit:
rts
cen11
lea vir1(pc),a0
bra.L write_text
cen: dc.l $4eaeff88,$60b241fa
dc.l $0d00202e,$02266712
**************************************************************************
*
* CENTURION - LINK VIRUS
*
* makes himself resident, changes the DOIO & KICKSUM.
*
* Virus is 3916 bytes long and tries to infect the programs in
* the startup-sequence.
* After XX resets he changes the mousepointer to a smiley with a
* little scroller.
*
***************************************************************************
Disaster_Master:
move.l $04.w,a6
move.l 550(a6),d0
beq.s disaster_exit
move.l d0,a0
move.l (a0),a0
cmp.w #$4afc,(a0)+ ; isses denn RESIDENT???
bne.s disaster_exit
move.l (a0)+,a2
move.l (a0)+,a1
sub.l a2,a1
cmpa.l #$1e,a1 ; is immer seine struct laenge
bne.s disaster_exit
move.l (a0),d0
cmp.l #$01210873,d0 ; sind seine flags
bne.s disaster_exit
add.l #12,a0
move.l (a0),a0
move.l a0,a2 ; backsave
add.l #8,a0
move.l (a0),d0
cmp.l #$011cd7c0,d0 ; teil seines codes
bne.s disaster_exit
move.w #$4e75,(a2) ; castrated
move.l a2,a0
add.l #$14a,a0
move.l (a0),-454(a6) ; rauswerfen
bsr.L clear_kicktag
move.b #1,virusflag-VAR(A5)
tst.b launch-VAR(a5)
bne.s disaster1
move.l #mes14,d2
move.l #mes14length,d3
bra.L writer1
disaster_exit
rts
disaster1
lea vir2(pc),a0
bra.L write_text
**************************************************************************
*
* DISASTER-MASTER V2 FILE VIRUS
*
* makes himself resident and changes the DOIO.
*
* Virus is 1740 bytes long, his name is 'CLS' and is
* found in the 'C' Dir.
* When he has infected a disk, he is always the first command
* in the startup-sequence -> 'CLS *'
* If you execute him he will clear screen, but if you execute him
* with 'CLS *' he will do nothing. Looks like a option!
* Infects everything with 's/startup-sequence' even harddisks.
*
***************************************************************************
* here begins the part taken from VIRUSX4.0 by STEVE TIBBET
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; Check for and Remove the Xeno Virus
;
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
xeno:
move.l DOSBase(pc),a0 ; Get addr of Open() Vector
sub.w #$1c,a0
move.l (a0),a0
move.l a0,d0 ;: If Bit 0 of the Address is set,
btst #0,d0 ;: then it's not really an address
bne.s NoVirus_xeno
cmp.l #$B47C03EE,(a0)
bne.s NoVirus_xeno
cmp.l #$67000224,4(a0)
bne.s NoVirus_xeno
;:: If we're here, we're fairly sure A0 is pointing to the
;:: base of the Xeno virus (well, not it's base, but the address
;:: of the first vector it stole, the Open() one.
;:: So we'll nuke it. 8-)
move.w #$6000,$4(a0)
move.w #$603E,$240(a0)
move.w #$601E,$29C(a0)
* END OF PART
move.b #1,virusflag-VAR(A5)
tst.b launch-VAR(a5)
bne.s xeno1
move.l #mes13,d2
move.l #mes13length,d3
bsr.L writer
NoVirus_xeno:
rts
xeno1
lea vir3(pc),a0
bra.L write_text
; i hate to do this, but until now i never got a xeno virus and was
; therefore not able to do my own killer.
; in addition to that: I HATE THE WAY S.TIBBET KILLS VIRUSES!!!!!!!
; it is not very intelligent to look for a checksum....
revenge:
move.l $04.w,a6
cmp.l #$7e060,46(a6)
bne.s revenge_ende
move.l $c0,d0
cmp.l #$0c794ef9,$c0
bne.s revenge_ende
move.l $7e068,-454(a6) ; restoring the old pointers
move.l $7e06e,148(a6) ; by grabbing his saved systemcalls
lea $7e000,a0 ; the virus
bsr.L filler
lea $c0,a0 ; CLEAR
moveq #0,d0 ; his routine
moveq.l #$10,d6 ; located at $c0
rev1:
move.l d0,(a0)+
dbf d6,rev1
bsr.L killcold_cool ; out of memory!! HE HE..
move.b #1,virusflag-VAR(A5)
tst.b launch-VAR(a5)
bne.s revenge11
move.l #mes12,d2
move.l #mes12length,d3
bra.L writer1
revenge_ende:
rts
revenge11
lea vir4(pc),a0
bra.L write_text
*************************************************************************
* REVENGE is a stupid one, it copies a small CONTROLLER part down to
* $c0 and is ALWAYS located at $7e000. (No interest in Fast Mem!!)
* I only added this one, because it was easy and BERSERKER III crashed
* when REVENGE was in memory. (uses cold cap., 148(a6) & -454(a6) DOIO)
*************************************************************************
revenge_boot: ; seems to be a brand new one...
bsr.L tracker
move.l a0,revenge1-VAR(a5)
move.l (a0),d4
swap d4
cmp.b #$fe,d4 ; Is this pointer normal? (V1.2)
beq.L revenge_boot_ende
cmp.b #$ff,d4 ; Is this pointer normal? (V1.3)
beq.L revenge_boot_ende
move.l $4.w,a6 ; using his own check
moveq #0,d0 ; routine...
move.w $94(a6),d0
and.l #$f0,d0
cmp.w #$f0,d0
beq.L revenge_boot_ende ; not in memory
move.l (a0),a1
add.l #$228,a1
move.l (a1),revenge_track-VAR(a5); -28(trackdisk.device)
add.l #$4,a1
move.l (a1),revenge_rast-VAR(a5); 148(a6)
add.l #$4,a1
move.l (a1),revenge_alloc-VAR(a5); the part he spreads
sub.l #$3c4,a1
move.l a1,revenge_mem-VAR(a5) ; his own start
move.l revenge1-VAR(a5),a0 ; restoring pointers
move.l revenge_track-VAR(a5),(a0)
move.l revenge_rast-VAR(a5),$94(a6)
bsr.L clear_kicktag
move.l revenge_mem-VAR(a5),a0
bsr.L filler
move.l revenge_alloc-VAR(a5),a0
bsr.L filler
move.l revenge_alloc-VAR(a5),a1 ; he allocatesw memory..
move.l #$400,d0 ; ani i give it back...
jsr freemem(a6)
move.b #1,virusflag-VAR(A5)
tst.b launch-VAR(a5)
bne.s revenge_boot1
move.l #mes11,d2
move.l #mes11length,d3
bra.L writer1
revenge_boot_ende:
rts
revenge_boot1
lea vir5(pc),a0
bra.L write_text
*************************************************************************
*
* seems to be a new one -> contains ASCII Text 'REVENGE BOOTLOADER'
*
*************************************************************************
disk_doctor:
move.l $04.w,a6 ; Disk-Doc uses cold & cool capture
move.l 46(a6),d0
; No other virus uses both
beq.L dd0 ; pointers... [ hope so !!! ]
move.l 42(a6),d0
beq.L dd0
move.l 42(a6),diskdoc-VAR(a5) ; I had to add this very
move.l diskdoc-VAR(a5),a0 ; complicated routine because
add.l #$c4,a0 ; Disk-Doc uses or changes:
move.l a0,a1 ; - cool capt.
addq.l #4,a1 ; - cold capt.
move.w #$4e75,(a1) ; - DoIO
jsr (a0) ; - 148(a6) [what's that?]
move.l a2,diskdoc1-VAR(a5) ; - The task of clipboard.device
addq.l #6,a2
move.l a2,a3 ; This routine gets the adress of
addq.l #4,a2 ; its task routine and cuts it off
move.w #$4e75,(a2)
jsr (a3)
move.l a0,diskdoc2-VAR(a5)
bsr.L killcold_cool
move.l $04.w,a6
move.l #$fc06dc,-$1c6(A6); Only Kick 1.2 values, on 1.3
move.l #$fc12fc,148(a6) ; Disk-Doc shouldn't work...
move.l diskdoc-VAR(a5),a0
move.l a0,a1
add.l #$1a0,a1
moveq #0,d0
dd2: move.l d0,(a0)+
cmpa.l a0,a1
bge.s dd2
move.l diskdoc1-VAR(a5),a2
move.w #$4e75,(a2)
move.l diskdoc2-VAR(a5),a2
move.w #$4e75,(a2)
move.b #1,virusflag-VAR(A5)
tst.b launch-VAR(a5)
bne.s dd1
move.l #mes6,d2
move.l #mes6length,d3
bra.L writer1
dd0: rts
dd1
lea vir7(pc),a0
bra.L write_text
***********************************************************************
*
* DISK-DOCTOR
*
* - After each reset Disk Doctor allocates more memory
* - This was in my opinion the best one, although it could be
* better: - it uses DoIO pointer from Kick 1.2 (crash on 1.3)
* - you can read text in the boot-block
* - it uses the clipboard task for its dirty work
* - it uses cold & cool capture to stay in memory
*
* For such kind of virus Guardian or VirusX are the best killers!!
* ( Find them in the boot and fight them when they are harmless! )
* Same with TIMEBOMB, Berserker can't fight this one........
************************************************************************
gadaffi:
move.l $04.w,a6 ; Gadaffi uses cool capture
cmp.l #0,46(a6) ; for its dirty work...
beq.s gad0 ; no cool capture set
cmp.l #$47414441,$7fb40; Gadaffi
bne.s gad0 ; is ALWAYS to be found at $7fb00
move.l -$1c6(a6),d5 ; $4b0 with 512 kb
swap d5
cmp.w #$fc,d5 ; $fc06dc (1.2) $fc0718 (1.3)
beq.s gad0
move.l 46(a6),gadaf-VAR(a5)
bsr.L killcold_cool ; Clear its cool pointer
move.l $04.w,a6
move.l #$fc06dc,-$1c6(A6)
bsr.L clear_kicktag
move.l gadaf-VAR(a5),a0
sub.l #$dc,a0
bsr.L filler
move.b #1,virusflag-VAR(A5)
tst.b launch-VAR(a5)
bne.s gad11
move.l #mes4,d2
move.l #mes4length,d3
bra.L writer1
gad0: rts
gad11
lea vir11(pc),a0
bra.L write_text
********************************************************************
*
* GADAFFI is a mutant version of Byte Warrior
*
* - It changes cool capture, kicktag. and DoIO
* - It is much more stupid than Byte Warrior:
* -> you can read it in the boot...
* -> normally it crashes with Kick 1.3 because
* he uses the DoIO vector of 1.2 itself
* - After 12 resets it tries to kill your drive, or
* was it playing a drive music ?? (I don't see any difference!)
*
********************************************************************
bsg:
move.l $04.w,a6
move.l 546(a6),d0 ; BSG 9 is a resident module
adda.l 550(a6),d0 ; It is still in memory after
adda.l 554(a6),d0 ; a reset
beq.s bsgende
move.l 550(a6),a0 ; Searching from A0
move.l a0,a1
add.l #$1000,a1 ; Searching to A1
move.l #$00005454,d0 ; Searching for 'TT'
moveq #0,d1
bsg0:
move.w (a0)+,d1
cmp.w d1,d0
beq.s bsg1
cmpa.l a0,a1
bge.s bsg0
rts ; Nothing found !
; It is not always a virus which
; uses these pointers. It could
bsg1: ; also be your ramdrive....
move.w #$5631,d0
move.w (a0),d1
cmp.w d1,d0
bne.s bsg0
moveq #0,d0 ; Kills it from beginning
move.l a0,a1 ; to 'TTV1' <- its end marker
move.l 550(a6),a0
bsg2:
move.l d0,(a0)+
cmpa.l a0,a1
bne.s bsg2
bsr.L clear_kicktag
move.b #1,virusflag-VAR(A5)
tst.b launch-VAR(a5)
bne.s bsg3
move.l #mes2,d2
move.l #mes2length,d3
bra.L writer
bsgende:
rts
bsg3
lea vir9(pc),a0
bra.L write_text
********************************************************************
*
* BSG 9 is an intelligent version of a link virus
*
* - It always modifies the FIRST file of the startup-
* sequence
* - The file now always is about 2608 bytes long
* - The old file in in the devs dir with
* spaces instead of a name now
* - After the fourth or fifth reset it turns the
* screen black and prints out its stupid message.
*
*********************************************************************
irq: ; changes oldopen
move.l $04.w,a6
move.l -$196(a6),d4
swap d4
cmp.b #$fc,d4 ; V1.2 00fc1430 V1.3 00fc146c
beq.s irq5
move.l -$196(a6),a4
add.w #8,a4
move.l #$4e714e71,(a4) ; Castrate virus
sub.l #$196,a6 ; In this part the old
move.l (a6),a4 ; oldopenlib call
add.l #18,a4 ; is restored...
move.l (a4),(a6)
move.b #1,virusflag-VAR(A5)
tst.b launch-VAR(a5)
bne.s irq1
move.l #mes3,d2
move.l #mes3length,d3
bra.L writer
irq5 rts
irq1 lea vir10(pc),a0
bra.L write_text
**************************************************************
*
* The IRQ Team Virus was the first link virus
* on AMIGA...
*
* It uses oldopenlibrary for its dirty work.
* In order to work properly with all Kickstart
* versions the IRQ-virus saves the replaced
* sytemcall in memory.
* To let my Berserker work with all kick versions
* I just grab his saved sytemcall in order to
* throw him out properly...
*
**************************************************************
exterminator: ; in trddevice, doio & kicktag... ($4678, $414, $898)
bsr.L tracker
move.l a0,exter-VAR(a5)
move.l (a0),d4
swap d4
cmp.b #$fe,d4 ; Is the pointer normal (V1.2)
beq.L exe4
cmp.b #$ff,d4
beq.L exe4 ; Is the pointer normal (V1.3)
move.l a6,a4
sub.w #$262,a4 ; In A5 now Exterminator's address..
move.l a4,exter1-VAR(a5)
move.l (a4),d4
swap d4
cmp.b #$fc,d4 ; Is it the normal system call?
beq.s exe4
move.l exter1-VAR(a5),a4
move.l (a4),a0
sub.l #$14e,a0
move.l a0,a1
add.l #$400,a1
moveq #0,d1
moveq #0,d0
exe7:
move.w #$4c41,d0 ; We are looking for 'LAMER'
move.w (a0)+,d1
cmp.w d1,d0
beq.s exe2
cmpa.l a0,a1
bge.s exe7
rts
exe2:
move.w #$4d45,d0
move.w (a0),d1
cmp.w d1,d0
bne.s exe7
add.l #28,a0 ; Here exteminator saves his
move.l (a0)+,a1 ; changed system calls
move.l (a0)+,a2
bsr.L clear_kicktag
move.l exter1-VAR(a5),a0 ; Correct both pointers
move.l a1,(a0)
move.l exter-VAR(a5),a0
move.l a2,(a0)
move.l exter1-VAR(a5),a4 ; Crucify it
move.l (a4),a0
sub.l #$14e,a0
bsr.L filler
move.b #1,virusflag-VAR(A5)
tst.b launch-VAR(a5)
bne.s exe1
move.l #mes9,d2
move.l #mes9length,d3
bra.L writer1
exe4: rts
exe1
lea vir13(pc),a0
bra.L write_text
***********************************************************************
sca:
move.l $04.w,a6
move.l 46(a6),d2 ; Cold-capture
bne.s sca1
rts
sca1:
move.b #1,virusflag-VAR(A5)
move.l 46(a6),a0
move.l a0,a1
sub.l #$3e,a0 ; We are now searching
add.l #$400,a1 ; for jsr -456(a6) [DoIO]
moveq #0,d1 ; if cold capture is set
moveq #0,d0 ; and in the routine is
sca2: ; a DoIO it is 100% a
move.w #$4eae,d0 ; virus ( mostly mutants)
move.w (a0)+,d1
cmp.w d1,d0
beq.s sca3
cmpa.l a0,a1
bge.s sca2
rts ; Nothing found
sca3:
move.w #$fe38,d0
move.w (a0),d1
cmp.w d1,d0
bne.s sca2
move.l $7eff0,d2 ; Here is the direct test
cmp.l #$53434121,d2 ; if it is SCA or AEK or LSD
beq.s sca4 ; if it is none of them it is
; another mutant SCA...
bra.s scamutants
sca4:
tst.b launch-VAR(a5)
bne.s sca01
move.l #mes5,d2 ; SCA
move.l #mes5length,d3
bsr.L writer1
bra.s scakill
sca01
lea vir12(pc),a0
bsr.L write_text
bra.s scakill
scamutants:
tst.b launch-VAR(a5)
bne.s sca02
move.l #mes8,d2 ; Mutant
move.l #mes8length,d3
bsr.L writer1
scakill:
move.l 46(a6),a0
sub.l #$3e,a0
bsr.L filler
bra.L killcold_cool ; Repairs both vectors
sca02
lea vir6(pc),a0
bsr.L write_text
bra.s scakill
************************************************************************
dasa:
move.l $04.w,a6
move.l -$1c6(a6),d5 ; $4b0 with 512 kb
swap d5
cmp.w #$fc,d5 ; $fc06dc (1.2) $fc0718 (1.3)
bne.s dasa0
move.l $7f804,d5 ; Dasa is ALWAYS at $7f800
cmp.l #$64116dec,d5 ; no need to restore doio
beq.s dasa1 ; pointer (not changed)
rts
dasa0:
move.l #$00fc06dc,-$1c6(a6) ; Remove its pointer
dasa1: move.l -$1c6(a6),a3
sub.l #$16e,a3 ; Its beginning
bsr.L clear_kicktag
move.l #$4ff,d1 ; Delete virus
dasa2: move.b d0,(a3)+
dbf d1,dasa2
move.b #1,virusflag-VAR(A5)
tst.b launch-VAR(a5)
bne.s dasa3
move.l #mes1,d2
move.l #mes1length,d3
bra.L writer1
dasa3
lea vir8(pc),a0
bra.L write_text
****************************************************************
*
* DASA is the Byte Warrior
*
* DASA is always located at $7f800 and since
* it uses a direct jump for DoIO of kick V1.2
* ( jmp $fc06dc ) for his own copy-routines it
* crashes on kick v1.3.
* Therefore I have added this two way search, because
* when it's kick 1.3 DASA can't work but is still in
* memory and I don't like a virus in memory...
*
* ONLY A DEAD VIRUS IS A GOOD VIRUS!!!!
*
***************************************************************
bytebandit: ; Searches for byte bandit
bsr.L tracker
move.l a0,bb1
cmp.l #$00f00000,a0
ble.s bytebandit1 ; OK! DoIO is changed
rts
bytebandit1:
move.l 148(a6),a0 ; Now second test if it
cmp.l #$00f00000,a0 ; is really byte bandit
ble.s bytebandit2 ; LAMER also changes DoIO!
rts
bytebandit2: ; it is byte bandit!!
move.l a0,a4
add.l #$10c,a0 ; Here the pointers are
move.l (a0)+,a1 ; saved...
move.l (a0),a2
move.l bb1,a0
move.l a1,(a0) ; Restoring both
move.l a2,148(a6) ; pointers...
bsr.L clear_kicktag
sub.l #$2ca,a4 ; Its beginning
move.l a4,a0
bsr.L filler
move.b #1,virusflag-VAR(A5)
tst.b launch-VAR(a5)
bne.s bb22
move.l #mes10,d2
move.l #mes10length,d3
bra.L writer1
bb22
lea vir14(pc),a0
bra.L write_text
***************** M E S S A G E S AND D A T A S ********************
even
mes: dc.b $0a,'Virus killed, check your disks....'
dc.b $0a,$0a
mesend:
meslength = mesend-mes
even
mes0: dc.b $0a,$9b,'7;32;41m'
dc.b $1b,'[1m'
dc.b ' BERSERKER found ** NO VIRUS ** in memory !!! '
dc.b $1b,'[0m'
dc.b $9b,'0;31;40m'
dc.b $0a,$0a
mes0end:
mes0length = mes0end-mes0
even
mes1: dc.b $0a,$0c,'DANGER!! BYTE - WARRIOR (DASA) VIRUS found'
mes1end:
mes1length = mes1end-mes1
even
mes2: dc.b $0a,$0c,'DANGER!! BSG 9 LINK - VIRUS killed!!!'
dc.b $0a,'Check first prog. in startup seq. or look into devs.'
dc.b $0a
mes2end:
mes2length = mes2end-mes2
even
mes3: dc.b $0a,$0c,'DANGER!! IRQ LINK - VIRUS killed!!!'
dc.b $0a,'Check 2nd prog. in startup seq. or cli-command DIR.'
dc.b $0a
mes3end:
mes3length = mes3end-mes3
even
mes4: dc.b $0a,$0c,'DANGER!! GADAFFI - VIRUS found!!!'
mes4end:
mes4length = mes4end-mes4
even
mes5: dc.b $0a,$0c,'DANGER!! SCA - VIRUS found!!!'
mes5end:
mes5length = mes5end-mes5
even
mes6: dc.b $0a,$0c,'DANGER!! Disk-Doctor VIRUS found!!!'
mes6end:
mes6length = mes6end-mes6
even
mes8: dc.b $0a,$0c,'DANGER!! MUTANT SCA - VIRUS found!!!'
mes8end:
mes8length = mes8end-mes8
even
mes9: dc.b $0a,$0c,'DANGER!! EXTERMINATOR (Lamer!) found!!!'
mes9end:
mes9length = mes9end-mes9
even
mes10: dc.b $0a,$0c,'DANGER!! BYTE - BANDIT VIRUS found!!!'
mes10end:
mes10length = mes10end-mes10
even
mes11: dc.b $0a,$0c,'DANGER!! REVENGE - BOOTLOADER VIRUS found!'
mes11end:
mes11length = mes11end-mes11
even
mes12: dc.b $0a,$0c,'DANGER!! REVENGE VIRUS found!'
mes12end:
mes12length = mes12end-mes12
even
mes13: dc.b $0a,$0c,'DANGER!! XENO LINK - VIRUS neutralized!!'
dc.b $0a,'Check files on disks and hard-disk with "KV".'
dc.b $0a,$0a
mes13end:
mes13length = mes13end-mes13
even
mes14: dc.b $0a,$0c,'DANGER!! Disaster-Master V2 FILE VIRUS killed!!!'
dc.b $0a,'Check first prog. in startup seq. & cli-command CLS.'
dc.b $0a,$0a
mes14end:
mes14length = mes14end-mes14
even
mes16: dc.b $0a,$0c,'DANGER!! CENTURION LINK - VIRUS neutralized!!'
dc.b $0a,'Check files in startup-sequence.'
dc.b $0a,$0a
mes16end:
mes16length = mes16end-mes16
even
mes17: dc.b $0a,$0c,'SORRY!! You have the wrong KICKSTART.'
dc.b $0a,'BERSERKER cannot work with this version.'
dc.b $0a,$0a
mes17end:
mes17length = mes17end-mes17
even
mes18: dc.b $0a,$0c,'DANGER!! Traveling Jack - VIRUS neutralized!!'
dc.b $0a
mes18end:
mes18length = mes18end-mes18
even
mes19: dc.b $0a
dc.b " BERSERKER could not load 'BERSERKER-HANDLER'.. "
dc.b $0a
mes19end:
mes19length = mes19end-mes19
even
mes20: dc.b " was NOT installed!! "
mes20end:
dc.b 0
mes20length = mes20end-mes20
even
mes21: dc.b " CHECKER is removed!! "
mes21end:
dc.b 0
mes21length = mes21end-mes21
even
mes22: dc.b " CHECKER is installed."
mes22end:
dc.b 0
mes22length = mes22end-mes22
even
mes23: dc.b " ALREADY installed...."
mes23end:
dc.b 0
mes23length = mes23end-mes23
even
mes24: dc.b $0a,$0a
mes24end:
mes24length = mes24end-mes24
even
mes25: dc.b " !! could not load !! ",0
mes25end:
mes25length = mes25end-mes25
even
mes15:
dc.b $0c,$1b,'[1m',' ***** BERSERKER 5.02 *****'
dc.b $1b,'[0m'
dc.b $0a
dc.b $0a,' 1. This Viruskiller finds and destroys the following:'
dc.b $0a,' Byte Bandit, Byte Warrior (DASA), SCA, AEK, LSD,'
dc.b $0a,' OBELISK, WARHAWK, PENTAGON, BAMIGA S1, NORTHSTAR,'
dc.b $0a,' Exterminator (LAMER) all versions, GADAFFI Virus,'
dc.b $0a,' Disk-Doctor Virus, IRQ-Team 41 Virus (Link Virus),'
dc.b $0a,' BSG9 VIRUS (Link Virus), REVENGE BOOTLOADER Virus,'
dc.b $0a,' REVENGE, XENO Link, Disaster Master File Virus,'
dc.b $0a,' CENTURION & JACK Link Virus (all versions).'
dc.b $0a,' 2. All bootblock viruses will be deleted from memory'
dc.b $0a,' and all changed system pointers will be restored.'
dc.b $0a,' 3. The Link Viruses are only killed in memory. They'
dc.b $0a,' might have infected some prgs. on disk!! Take care!'
dc.b $0a,' If you want protection from JACK and CENTURION'
dc.b $0a,' you have to choose option I ( install checker ).'
mes115end:
mes115length = mes115end-mes15
dc.b $0a,' 4. Berserker gives you the choice to kill the cold- &'
dc.b $0a,' cool capture....(only from CLI)'
dc.b $0a,' 5. BERSERKER checks libraries.....'
dc.b $0a,' 6. You can launch a permanent CHECKER, which remains'
dc.b $0a,' in memory and checks always for JACK & CENTURION.'
dc.b $0a
dc.b $1b,'[1m' ; dick
dc.b $0a,' CLI OPTIONS: [ C (kill COLD & COOL)] [ ? (instructions)]'
DC.B $0A,' [ I (install checker)] [ R (remove checker)]'
dc.b $1b,'[0m'
dc.b $0a
dc.b $1b,'[1m'
dc.b $0a,' This program is in the PUBLIC DOMAIN!!!'
dc.b $1b,'[3m'
dc.b $0a
dc.b $0a,' ©Copyright 1988, 1989, 1990 by Ralf Thanner.'
dc.b $1b,'[0m'
dc.b $0a
mes15end:
mes15length = mes15end-mes15
mes315length = mes15end-mes115end
even
mes215:
dc.b $0a,$0a,$1b,'[1m' ; dick
dc.b $0a,' PRESS RIGHT MOUSE BUTTON'
dc.b $1b,'[0m'
mes215end:
mes215length = mes215end-mes215
EVEN
mes415:
dc.b $0a,$0a,$1b,'[1m' ; dick
dc.b $0a,' PRESS RETURN'
dc.b $1b,'[0m'
mes415end:
mes415length = mes415end-mes415
EVEN
con:
dc.b'CON:0/0/640/190/ BERSERKER 5.02 INSTRUCTIONS ',0
EVEN
con_error:
dc.b $0c
con_clear:
EVEN
;=============================================================================
VAR:
newtaskpri: dc.l 0
mytask: dc.l 0
my_rastport: dc.l 0
windowhandle: dc.l 0
message_list: dc.l 0,0,0
userport: dc.l 0
gad_table: dc.l gad1,gad2,gad3,gad4,gad5
revenge1: dc.l 0
revenge_alloc: dc.l 0
revenge_track: dc.l 0
revenge_rast: dc.l 0
revenge_mem: dc.l 0
diskdoc: dc.l 0
diskdoc1: dc.l 0
diskdoc2: dc.l 0
gadaf: dc.l 0
bb1: dc.l 0
exter: dc.l 0
exter1: dc.l 0
expbase: dc.l 0
gfxbase: dc.l 0
laybase: dc.l 0
dosbase: dc.l 0
IntBase: dc.l 0
trackdisk: dc.l 0
handle: dc.l 0
message: dc.l 0
kickflag: dc.w 0
pal: dc.w 0
input_buffer: dc.w 0
launcher: dc.b 0
remover: dc.b 0
no_killy: dc.b $ff
virusflag: dc.b 0
leave_it: dc.b 0
launch: dc.b 0
TASK_NAME: dc.b 'BerserkerV5.0',0
MSG_PORT_NAME: dc.b 'BERSERKER',0
EVEN
NAME: DC.B 'l:Berserker-Handler',0
EVEN
TRDDEVICE: DC.B 'trackdisk.device',0
EVEN
INTNAME: DC.B 'intuition.library',0
EVEN
EXPNAME: DC.B 'expansion.library',0
EVEN
GFXNAME: DC.B 'graphics.library',0
EVEN
LAYNAME: DC.B 'layers.library',0
EVEN
DOSNAME: DC.B 'dos.library',0
EVEN
EXENAME: DC.B 'exec.library',0
EVEN
;=============================================================================
alert1: dc.w 178
dc.b 16
dc.b 'Berserker found VIRUS in memory!'
EVEN
alert3: dc.w 128
dc.b 16
dc.b 'CHECKSUM of '
alert4: dc.b ' '
dc.b 'is NOT correct....',0
EVEN
NewWindowStructure1:
dc.w 0,0 ;105,58 ;window XY origin relative to TopLeft of screen
dc.w 204,130 ;window width and height
dc.b 0,2 ;detail and block pens
dc.l CLOSEWINDOW+GADGETUP ;IDCMP flags
dc.l WINDOWDEPTH+WINDOWCLOSE+WINDOWDRAG+ACTIVATE+WINDOWACTIVE+NOCAREREFRESH+RMBTRAP
dc.l GadgetList1 ;first gadget in gadget list
dc.l NULL ;custom CHECKMARK imagery
dc.l NewWindowName1 ;window title
dc.l NULL ;custom screen pointer
dc.l NULL ;custom bitmap
dc.w 5,5 ;minimum width and height
dc.w -1,-1 ;maximum width and height
dc.w WBENCHSCREEN ;destination screen type
NewWindowName1:
dc.b 'BERSERKER 5.02 ',0
EVEN
GadgetList1:
Gad1:
dc.l Gad2 ;next gadget
dc.w 28,26-9 ;origin XY of hit box relative to window TopLeft
dc.w 149,11 ;hit box width and height
dc.w NULL ;gadget flags
dc.w RELVERIFY ;activation flags
dc.w BOOLGADGET ;gadget type flags
dc.l Border1 ;gadget border or image to be rendered
dc.l NULL ;alternate imagery for selection
dc.l IText1 ;first IntuiText structure
dc.l NULL ;gadget mutual-exclude long word
dc.l NULL ;SpecialInfo structure
dc.w NULL ;user-definable data
dc.l NULL ;pointer to user-definable data
Border1:
dc.w -1,0 ;XY origin relative to container TopLeft
dc.b 3,0,RP_JAM1 ;front pen, back pen and drawmode
dc.b 5 ;number of XY vectors
dc.l BorderVectors2 ;pointer to XY vectors
dc.l NULL ;next border in list
IText1:
dc.b 3,0,RP_JAM2,0 ;front and back text pens, drawmode and fill byte
dc.w 24,1+1 ;XY origin relative to container TopLeft
dc.l NULL ;font pointer or NULL for default
dc.l ITextText1
dc.l NULL ;next IntuiText structure
ITextText1:
dc.b 'CHECK MEMORY',0
EVEN
Gad2:
dc.l Gad3
dc.w 28,42-9
dc.w 149,11
dc.w NULL
dc.w RELVERIFY
dc.w BOOLGADGET
dc.l Border1
dc.l NULL
dc.l IText2
dc.l NULL
dc.l NULL
dc.w null
dc.l NULL
BorderVectors2:
dc.w 0,-1
dc.w 149,-1
dc.w 149,11
dc.w 0,11
dc.w 0,-1
IText2:
dc.b 3,0,RP_JAM2,0
dc.w 1+5,1+1
dc.l NULL
dc.l ITextText2
dc.l NULL
ITextText2:
dc.b ' INSTALL CHECKER',0
EVEN
Gad3:
dc.l Gad4
dc.w 28,58-9
dc.w 149,11
dc.w NULL
dc.w RELVERIFY
dc.w BOOLGADGET
dc.l Border1
dc.l NULL
dc.l IText3
dc.l NULL
dc.l NULL
dc.w null
dc.l NULL
IText3:
dc.b 3,0,RP_JAM2,0
dc.w 5+5,1+1
dc.l NULL
dc.l ITextText3
dc.l NULL
ITextText3:
dc.b ' REMOVE CHECKER',0
EVEN
Gad4:
dc.l Gad5
dc.w 28,74-9
dc.w 149,11
dc.w NULL
dc.w RELVERIFY
dc.w BOOLGADGET
dc.l Border1
dc.l NULL
dc.l IText4
dc.l NULL
dc.l NULL
dc.w null
dc.l NULL
IText4:
dc.b 3,0,RP_JAM2,0
dc.w 11+8,1+1
dc.l NULL
dc.l ITextText4
dc.l NULL
ITextText4:
dc.b ' INSTRUCTIONS',0
EVEN
Gad5:
dc.l NULL
dc.w 28,97-9
dc.w 149,11
dc.w NULL
dc.w RELVERIFY
dc.w BOOLGADGET
dc.l Border1
dc.l NULL
dc.l IText5
dc.l NULL
dc.l NULL
dc.w null
dc.l NULL
IText5:
dc.b 1,3,RP_jam1,0
dc.w 21+4,1+1
dc.l NULL
dc.l ITextText5
dc.l NULL
ITextText5:
dc.b ' «» EXIT «»',0
EVEN
Border:
dc.w 0,0 ;XY origin relative to container TopLeft
dc.b 1,0,RP_JAM1 ;front pen, back pen and drawmode
dc.b 5 ;number of XY vectors
dc.l BorderVectors6 ;pointer to XY vectors
dc.l NULL ;next border in list
BorderVectors6:
dc.w 0,-1
dc.w 199,-1
dc.w 199,18
dc.w 0,18
dc.w 0,-1
EVEN
IntText:
dc.b 1,0,RP_JAM2,0
dc.w 17,115
dc.l NULL
dc.l NULL
dc.l NULL
IText11:
dc.b ' NO VIRUS FOUND ',0
EVEN
VIR0
dc.b ' TRAVELING JACK ',0
EVEN
VIR1
dc.b ' CENTURION LINK ',0
EVEN
VIR2
dc.b ' DISASTER MASTER ',0
EVEN
VIR3
dc.b ' XENO LINK VIRUS ',0
EVEN
VIR4
dc.b ' REVENGE ',0
EVEN
VIR5
dc.b ' REV. BOOTLOADER ',0
EVEN
VIR6
dc.b ' MUTANT SCA ',0
EVEN
VIR7
dc.b ' DISK DOCTOR ',0
EVEN
VIR8
dc.b ' BYTE WARRIOR ',0
EVEN
VIR9
dc.b ' BSG 9 LINK ',0
EVEN
VIR10
dc.b ' IRQ TEAM 41 ',0
EVEN
VIR11
dc.b ' GADAFFI ',0
EVEN
VIR12
dc.b ' S C A ',0
EVEN
VIR13
dc.b ' EXTERMINATOR ',0
EVEN
VIR14
dc.b ' BYTE BANDIT ',0
EVEN